package com.kl.time;

import org.junit.Test;

import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class TimeApiTest {

    /**
     * Clock 类提供了访问当前日期和时间的方法，Clock 是时区敏感的，
     * 可以用来取代 System.currentTimeMillis() 来获取当前的微秒数
     */
    @Test
    public void testClock() {
        Clock clock = Clock.systemDefaultZone();
        // 当前时间戳
        long millis = clock.millis();
        System.out.println(millis);
    }

    /**
     * 某一个特定的时间点也可以使用 Instant类来表示， Instant 类也可以用来创建旧版本的 java.util.Date 对象
     * 获取时间戳:1970年1月1日至所记录时间的的毫秒数
     */
    @Test
    public void testInstant() {
        long toEpochMilli = Instant.now().toEpochMilli();
        long time = new Date().getTime();
        long currentTimeMillis = System.currentTimeMillis();

        System.out.println(toEpochMilli);
        System.out.println(time);
        System.out.println(currentTimeMillis);


    }

    /**
     * 时间格式化
     */
    @Test
    public void testTimeFormat() {
        // 方式一
        Clock clock = Clock.systemDefaultZone();
        String timeString = LocalDateTime.now(clock).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(timeString);

        // 方式二
        timeString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(timeString);

        // 方式三
        Instant instant = Instant.now();
        // 北京时间是东八区时间，因此需要对Instant实例化对象进行偏移量的设置
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        timeString = offsetDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(timeString);

        // 方式四
        timeString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        System.out.println(timeString);
    }

    /**
     * 通过时间戳创建时间对象
     */
    @Test
    public void testCreatTimeThoughtMills() {
        // 创建比当前时间早一个小时的时刻
        Date date = new Date(new Date().getTime() - 3600 * 1000);
        String timeString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);

        // 创建当前时刻
        Instant instant = Instant.now(Clock.systemDefaultZone());
        String time = instant.atOffset(ZoneOffset.ofHours(8)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        System.out.println(timeString);
        System.out.println(time);
    }

    /**
     * 时间的比较
     */
    @Test
    public void testCompareTime() {
        Date now = new Date();
        Date time1 = new Date(System.currentTimeMillis() - 3600 * 1000);
        Date time2 = new Date(System.currentTimeMillis() + 3600 * 1000);

        System.out.println(now.before(time1));//false
        System.out.println(now.before(time2));//true
        System.out.println(now.after(time1)); //true
        System.out.println(now.after(time2)); //false
    }

    /**
     * 可以单独获取到年月日，时分秒，甚至当前时间的月份和当前时间所属月份的第几天
     */
    @Test
    public void testLocalDateTime() {
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime.getYear());
        System.out.println(localDateTime.getMonth());
        System.out.println(localDateTime.getDayOfWeek());
        System.out.println(localDateTime.getDayOfMonth());
        System.out.println(localDateTime.getHour());
        System.out.println(localDateTime.getMinute());
        System.out.println(localDateTime.getSecond());

        // 对当前时间加上2个小时，30分钟，30秒
        localDateTime = localDateTime.plusHours(2).plusMinutes(30).plusSeconds(30);
        System.out.println(localDateTime);
        // 对当前时间减去10个小时，30分钟，30秒
        localDateTime = localDateTime.minusHours(10).minusMinutes(30).minusSeconds(30);
        System.out.println(localDateTime);
    }

}
